"use strict";

const Controller = require("egg").Controller;
// 请求支付功能
const AlipaySDK = require("alipay-sdk").default;
// 将支付信息用 formdata 包裹住
const AlipayFormData = require("alipay-sdk/lib/form").default;
class Pay extends Controller {
  async index() {
    const { ctx, config } = this;
    const { odd, pay, title, id } = ctx.query;
    //调用 并 配置
    const alipaySdk = new AlipaySDK({
      appId: config.payConfig.appId, // 沙箱环境的appId
      privateKey: config.payConfig.privateKey, // 私钥
      signType: config.payConfig.signType, // 签名类型
      alipayPublicKey: config.payConfig.alipayPublicKey, // 支付宝公钥
      gateway: config.payConfig.gateway, // 网关地址
      timeout: config.payConfig.timeout, // 网关超时时间
      camelcase: config.payConfig.camelcase, // 是否把网关返回的下划线 key 转换为驼峰写法
    });
    //支付信息
    const formData = new AlipayFormData();
    formData.setMethod("get");
    formData.addField("appId", config.payConfig.appId);
    formData.addField("charset", "utf-8");
    formData.addField("signType", config.payConfig.signType);
    formData.addField("notifyUrl", "http://localhost:8080/detail/");
    formData.addField("returnUrl", "http://localhost:8080/detail/");
    formData.addField("bizContent", {
      outTradeNo: odd, // 【必选】商户订单号：64个字符内，包含数字，字母，下划线；需要保证在商户端不重复
      productCode: "FAST_INSTANT_TRADE_PAY", // 【必选】销售产品码，目前仅支持FAST_INSTANT_TRADE_PAY
      totalAmount: pay, // 【必选】订单总金额，精确到小数点后两位
      subject: `商品:《${title}》`, // 【必选】 订单标题
      body: `购买《${title}》文章`, // 【可选】订单描述
    });
    /**
     * exec对应参数：
     * method（调用支付宝api）
     * params（api请求的参数（包含“公共请求参数”和“业务参数”））
     * options（validateSign，formData，log）
     */
    ctx.body = {
      statu: 200,
      //发送支付获取返回页面
      url: await alipaySdk.exec("alipay.trade.page.pay", {}, { formData }),
    };
  }
}

module.exports = Pay;
